import java.util.Vector;

public class Enemy extends Tank implements Runnable{

    Vector<Enemy> enemies = new Vector<>();
    public Enemy(int x, int y) {
        super(x, y);
    }
    public void setEnemies(Vector<Enemy> enemies) {
        this.enemies = enemies;
    }
    // 看当前坦克与其他坦克是否有重叠
    public boolean touchEnemy(){
        // 判断当前坦克的敌人方向
        switch (this.getDirect()){
            case 0:
                // 让当前坦克和其他所有坦克比较
                for (int i = 0; i < enemies.size(); i++) {
                    Enemy enemy = enemies.get(i);
                    if (enemy != this){
                        // 比较的坦克的横坐标范围: enemy.getX() ~ enemy.getX() + 40
                        // 比较的坦克的纵坐标范围: enemy.getY() ~ enemy.getY() + 60
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2){
                            // 判断当前坦克的左右坐标是否有重叠
                            if (getX() >= enemy.getX() && getX() <= enemy.getX()+40
                            && getY() >= enemy.getY() && getY() <= enemy.getY() + 60 ||
                             getX()+40 >= enemy.getX() && getX()+40 <= enemy.getX()+40
                             && getY() >= enemy.getY() && getY() <= enemy.getY() + 60 ){
                                return true;
                            }
                        }
                        if (enemy.getDirect() == 1 || enemy.getDirect() == 3){
                            if (getX() >= enemy.getX() && getX() <= enemy.getX() + 60
                                    && getY() >= enemy.getY() && getY() <= enemy.getY() + 40 ||
                                    getX()+40 >= enemy.getX() && getX()+40 <= enemy.getX()+60
                                    && getY() >= enemy.getY() && getY() <= enemy.getY() + 40){
                                return true;
                            }
                        }
                    }
                }
                break;
            case 1:
                // 让当前坦克和其他所有坦克比较
                for (int i = 0; i < enemies.size(); i++) {
                    Enemy enemy = enemies.get(i);
                    if (enemy != this){
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2){
                            // 判断当前坦克的左右坐标是否有重叠
                            if (getX()+60 >= enemy.getX() && getX()+60 <= enemy.getX()+40
                                    && getY() >= enemy.getY() && getY() <= enemy.getY() + 60 ||
                                    getX()+60 >= enemy.getX() && getX()+60 <= enemy.getX()+40
                                            && getY()+40 >= enemy.getY() && getY()+40 <= enemy.getY()+60 ){
                                return true;
                            }
                        }
                        if (enemy.getDirect() == 1 || enemy.getDirect() == 3){
                            if (getX()+60 >= enemy.getX() && getX()+60 <= enemy.getX() + 60
                                    && getY() >= enemy.getY() && getY() <= enemy.getY() + 40 ||
                                    getX()+60 >= enemy.getX() && getX()+60 <= enemy.getX() + 60
                                            && getY()+40 >= enemy.getY() && getY()+40 <= enemy.getY() + 40){
                                return true;
                            }
                        }
                    }
                }
                break;
            case 2:
                for (int i = 0; i < enemies.size(); i++) {
                    Enemy enemy = enemies.get(i);
                    if (enemy != this){
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2){
                            // 判断当前坦克的左右坐标是否有重叠
                            if (getX() >= enemy.getX() && getX() <= enemy.getX()+40
                                    && getY()+60 >= enemy.getY() && getY()+60 <= enemy.getY() + 60 ||
                                    getX()+40 >= enemy.getX() && getX()+40 <= enemy.getX()+40
                                            && getY()+60 >= enemy.getY() && getY() <= enemy.getY()+60 ){
                                return true;
                            }
                        }
                        if (enemy.getDirect() == 1 || enemy.getDirect() == 3){
                            if (getX() >= enemy.getX() && getX() <= enemy.getX() + 60
                                    && getY()+60 >= enemy.getY() && getY()+60 <= enemy.getY() + 40 ||
                                    getX()+40 >= enemy.getX() && getX() + 40 <= enemy.getX() + 60
                                            && getY()+60 >= enemy.getY() && getY()+60 <= enemy.getY() + 40){
                                return true;
                            }
                        }
                    }
                }
                break;
            case 3:
                // 让当前坦克和其他所有坦克比较
                for (int i = 0; i < enemies.size(); i++) {
                    Enemy enemy = enemies.get(i);
                    if (enemy != this){
                        // 比较的坦克的横坐标范围: enemy.getX() ~ enemy.getX() + 40
                        // 比较的坦克的纵坐标范围: enemy.getY() ~ enemy.getY() + 60
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2){
                            // 判断当前坦克的左右坐标是否有重叠
                            if (getX() >= enemy.getX() && getX() <= enemy.getX()+40
                                    && getY() >= enemy.getY() && getY() <= enemy.getY() + 60 ||
                                    getX() >= enemy.getX() && getX() <= enemy.getX()+40
                                            && getY()+40 >= enemy.getY() && getY()+40 <= enemy.getY() + 60 ){
                                return true;
                            }
                        }
                        if (enemy.getDirect() == 1 || enemy.getDirect() == 3){
                            if (getX() >= enemy.getX() && getX() <= enemy.getX() + 60
                                    && getY() >= enemy.getY() && getY() <= enemy.getY() + 40 ||
                                    getX() >= enemy.getX() && getX() <= enemy.getX() + 60
                                            && getY()+40 >= enemy.getY() && getY()+40 <= enemy.getY() + 40){
                                return true;
                            }
                        }
                    }
                }
                break;
        }
        return false;
    }

    @Override
    public void run() {
        while (true){
            switch (getDirect()){
                case 0:
                    for (int i = 0; i < 30; i++) {
                        if (!touchEnemy()){
                            up();
                        }
                        if (i % 10 == 0){
                            Shot shot = new Shot(getX()+20,getY(),0);
                            shots.add(shot);
                            new Thread(shot).start();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 1:
                    for (int i = 0; i < 30; i++) {
                        if (!touchEnemy()){
                            right();
                        }
                        if (i % 10 == 0){
                            Shot shot = new Shot(getX()+60,getY()+20,1);
                            shots.add(shot);
                            new Thread(shot).start();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 2:
                    for (int i = 0; i < 30; i++) {
                        if (!touchEnemy()){
                            down();
                        }
                        if (i % 10 == 0){
                            Shot shot = new Shot(getX()+20,getY()+60,2);
                            shots.add(shot);
                            new Thread(shot).start();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 3:
                    for (int i = 0; i < 30; i++) {
                        if (!touchEnemy()){
                            left();
                        }
                        if (i % 10 == 0){
                            Shot shot = new Shot(getX(),getY()+20,3);
                            shots.add(shot);
                            new Thread(shot).start();
                        }
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
            }
            // 随机改变方向  0  ~  3
            int direct = (int)(Math.random()*4);
            setDirect(direct);
        }
    }
}
